package org.example.shejimoshi.create.gongchang.jianchangongchang1;

public class SimpleFactoryTest {
    public static void main(String[] args) {

        /**
         * 简单工厂 ： 用来生产同一等级结构中的任意产品。（不支持拓展增加产品）
         * 工厂方法 ：用来生产同一等级结构中的固定产品。（支持拓展增加产品）
         * 抽象工厂 ：用来生产不同产品族的全部产品。（支持拓展增加产品；支持增加产品族）
         *
         * 简单工厂的适用场合：只有伦敦工厂（只有这一个等级），
         * 并且这个工厂只生产三种类型的pizza：chesse,pepper,greak（固定产品）。
         * 工厂方法的适用场合：现在不光有伦敦工厂，还增设了纽约工厂（仍然是同一等级结构，但是支持了产品的拓展），
         * 这两个工厂依然只生产三种类型的pizza：chesse,pepper,greak（固定产品）。
         * 抽象工厂的适用场合：不光增设了纽约工厂（仍然是同一等级结构，但是支持了产品的拓展），
         * 这两个工厂还增加了一种新的类型的pizza：chinese pizza（增加产品族）。
         *
         * 简单工厂:只有生产java或Python 书籍
         * 工厂方法 ：分别创建Java类书籍工厂与Python类书籍工厂
         * 抽象工厂 ：分别创建Java类书籍工厂与Python类书籍工厂而且还可以增加对应的java和python视频
         */
        //无使用简单工厂模式的代码案例
        Book javaBook = new JavaBook();
        javaBook.readBook();
        //使用简单工厂模式的代码案例——字符串参数
        BookFactory bookFactory = new BookFactory();
        // 使用字符串
        bookFactory.createBook("Java").readBook();

        //使用简单工厂模式的代码案例——类名（使用反射）
        BookFactory2 bookFactory2 = new BookFactory2();
        // 使用反射——类名
        bookFactory2.createBook("shejimoshi.danligongchang.jianchangongchang.JavaBook").readBook();

        BookFactory3 bookFactory3 = new BookFactory3();
        // 使用反射——类
        Book book = bookFactory3.createBook(JavaBook.class);
        book.readBook();


    }
}
